ADO nezvlada view

Otázka od: Delphin

15. 11. 2002 19:44

MS SQL2000, D5 SP2, ADO 2.7

V ADODataset mam select * from moje_view. Kdyz chci ulozit zaznam pomoci
ADODataset.post tak dostanu chybu
"Operace s více kroky vedla k vytvoření
chyb. Zkontrolujte všechny stavové hodnoty."
Zkusil jsem to same s Query z BDE a funguje to bez problemu.

View vypada priblizne takto
CREATE VIEW moje_view
AS
SELECT nullif(Sloupec,null) Sloupec
FROM Data

Chci se zeptat:
Znamena to tedy, ze existuji view, ktere v ADO nejdou a budu muset pouzit
BDE ?
Co jsou vlastne ty stavove hodnoty a kde se daji najit ?

Diky Delphin

Odpovedá: Petr Kejval

18. 11. 2002 7:17


----- Original Message -----
From: "Delphin" <delphin@post.cz>
To: <delphi-l@clexpert.cz>
Sent: Friday, November 15, 2002 6:35 PM
Subject: ADO nezvlada view


> MS SQL2000, D5 SP2, ADO 2.7
>
> V ADODataset mam select * from moje_view. Kdyz chci ulozit zaznam pomoci
> ADODataset.post tak dostanu chybu
"Operace s více kroky vedla k vytvoření
> chyb. Zkontrolujte všechny stavové hodnoty."
> Zkusil jsem to same s Query z BDE a funguje to bez problemu.
>

Zkus se podivat do helpu ADO 2.7 na UpdateCriteria, UniqueCatalog ,
UniqueSchema, UniqueTable a ResyncCommand.

V UniqueCatalog, UnigueSchema a UniqueTable zadas master tabulku tveho
view, v UpdateCriteria zadas podle ceho se bude hledat zaznam v master
tabulce např. ucKey - podle primarniho klice a ResyncCommand zadas SQL
prikaz pro resynchronizaci zmeneneho zaznamu v tvem datasetu s daty na
serveru.
Prikaz delete pak generuje pouze SQL prikaz DELETE pro smazani zaznamu v
tabulce master.
Prikaz edit - post generuje SQL prikaz/y UPDATE pro zaznam v tabulce master
i v tabulce detail (podle toho jaka pole jsou zmenena - jsou-li menena pouze
pole tabulky master generuje SQL prikaz pouze pro tabulku master, jsou-li
menena pouze pole tabulky detail generuje SQL prikaz pouze pro tabulku
detail, jsou-li menena pole tanulky master i detail generuje 2 SQL prikazy,
prvni pro tabulku master a druhy pro tabulku detail ). Prikaz
Insert(Append) - Post generuje SQL prikaz/y INSERT pro tabulku master i
detail (podle toho jaka pole jsou zadana - obdoba Edit - Post)

Petr Kejval

Odpovedá: Delphin

18. 11. 2002 15:22

> Zkus se podivat do helpu ADO 2.7 na UpdateCriteria, UniqueCatalog ,
> UniqueSchema, UniqueTable a ResyncCommand.
>
> V UniqueCatalog, UnigueSchema a UniqueTable zadas master tabulku tveho
> view, v UpdateCriteria zadas podle ceho se bude hledat zaznam v master
> tabulce např. ucKey - podle primarniho klice a ResyncCommand zadas SQL
> prikaz pro resynchronizaci zmeneneho zaznamu v tvem datasetu s daty na
> serveru.
> Prikaz delete pak generuje pouze SQL prikaz DELETE pro smazani zaznamu v
> tabulce master.
> Prikaz edit - post generuje SQL prikaz/y UPDATE pro zaznam v tabulce
master
> i v tabulce detail (podle toho jaka pole jsou zmenena - jsou-li menena
pouze
> pole tabulky master generuje SQL prikaz pouze pro tabulku master, jsou-li
> menena pouze pole tabulky detail generuje SQL prikaz pouze pro tabulku
> detail, jsou-li menena pole tanulky master i detail generuje 2 SQL
prikazy,
> prvni pro tabulku master a druhy pro tabulku detail ). Prikaz
> Insert(Append) - Post generuje SQL prikaz/y INSERT pro tabulku master i
> detail (podle toho jaka pole jsou zadana - obdoba Edit - Post)
>
> Petr Kejval

Jednoduche view se mi uz podarilo rozchodit, stale mi ale nejde slozite view
na funkci, ktere se da aktualizovat jenom triggerem. Opet to jde v BDE bez
problemu.

CREATE VIEW moje_view
AS
SELECT nullif(Sloupec,null) Sloupec
FROM dbo.FN(25)
INNER JOIN ......

Odpovedá: Blazek Jaroslav

19. 11. 2002 15:39

Ahoj,

> delphin@post.cz 15.11.02 18:35 >>>
>MS SQL2000, D5 SP2, ADO 2.7
>V ADODataset mam select * from moje_view. Kdyz chci ulozit zaznam pomoci
>ADODataset.post tak dostanu chybu
"Operace s více kroky vedla k vytvoření
>chyb. Zkontrolujte všechny stavové hodnoty."
>Zkusil jsem to same s Query z BDE a funguje to bez problemu.

tady nejde o ADO, ale o MSSQL....slozite View ti neudela primo MSSQL
jednoducha View lze updatovat, ale zase neni duvod...melo by se to dit
klasickym UPDATE na tabulku

pokud se snazis updatnout slozitejsi View, kde treba neco zretezujes, pouzivas
fce, tak ti primo server hodi chybu

CREATE VIEW ViewTabulka
AS
SELECT IdTabulka, ISNULL(Cislo, 0) AS Cislo
FROM Tabulka

UPDATE ViewTabulka SET Cislo = 10
WHERE IdTabulka = 1

Server: Msg 4406, Level ...
Update or insert of view or function 'ViewTabulka' failed because it contains a
derived or constant field.

>View vypada priblizne takto
>CREATE VIEW moje_view
>AS
>SELECT nullif(Sloupec,null) Sloupec
>FROM Data

tady hlavne nechapu jaky ma tenhle SELECT smysl, stejne ti vrati uplne stejna
data, jako jsou ve sloupci "Sloupec"

NULLIF ti vraci NULL pokud jsou danne hodnoty stejne, pokud jsou rozdilne vrati
ti prvni hodnotu

to si muzes vyzkouset

SELECT NULLIF(1, 1) -> result = NULL
SELECT NULLIF(1, NULL) -> result = 1
SELECT NULLIF(1, 2) -> result = 1

spis si mel na mysli pouzit asi ISNULL()

SELECT ISNULL(NULL, 0) -> result = 0


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Delphin

19. 11. 2002 17:36

>tady nejde o ADO, ale o MSSQL....slozite View ti neudela primo MSSQL
>jednoducha View lze updatovat, ale zase neni duvod...melo by se to dit
klasickym UPDATE na tabulku
>pokud se snazis updatnout slozitejsi View, kde treba neco zretezujes,
pouzivas fce, tak ti primo server hodi chybu
>Server: Msg 4406, Level ...
>Update or insert of view or function 'ViewTabulka' failed because it
contains a derived or constant field.

Samozrejme, ze tady jde o ADO, kdyz s BDE to slo. Zadne vyse uvedene chyby
mi to nehaze, pouzil jsem INSTEAD OF triggery. Bohuzel ADO mi vnucuje svou
spatnou metodu na aktualizaci a zcela nepochopitelne to nejde vypnout.

Odpovedá: Delphin

20. 11. 2002 10:23

>View vypada priblizne takto
>CREATE VIEW moje_view
>AS
>SELECT nullif(Sloupec,null) Sloupec
>FROM Data

>tady hlavne nechapu jaky ma tenhle SELECT smysl, stejne ti vrati uplne
stejna data, jako jsou ve sloupci "Sloupec"

Je to jenom priklad, moje view ma cca 20 sloupcu. Kdyz to tam neni, tak
funguje kontrola na platnost dat, tedy kdyz je ve view sloupec, ktery nesmi
byt null, tak server vyzaduje data. Kdyz tam dam to nullif, tak to server
oklame a nemusim mu ty data posilat, kdyz je stejne v triggeru nepotrebuju.